package com.cencat.framework.security.service;

import com.cencat.framework.security.model.LoginUser;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.Set;

/**
 * 用户详情服务实现
 * 注意：这里是一个示例实现，实际项目中需要根据具体的数据源来获取用户信息
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class UserDetailsServiceImpl implements UserDetailsService {
    
    /**
     * 根据用户名加载用户信息
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 这里应该从数据库或其他数据源中加载用户信息
        // 为了演示，这里创建一个模拟用户
        
        LoginUser loginUser = createMockUser(username);
        
        if (loginUser == null) {
            throw new UsernameNotFoundException("用户不存在: " + username);
        }
        
        log.debug("加载用户信息成功: username={}", username);
        
        return loginUser;
    }
    
    /**
     * 创建模拟用户（实际项目中应该从数据库查询）
     */
    private LoginUser createMockUser(String username) {
        LoginUser loginUser = new LoginUser();
        
        // 设置基本信息
        loginUser.setUserId(1L);
        loginUser.setUsername(username);
        loginUser.setPassword("$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iKTV5Ui."); // 密码: 123456
        loginUser.setRealName("管理员");
        loginUser.setEmail("admin@cencat.com");
        loginUser.setPhone("13800000000");
        loginUser.setTenantId(1L);
        loginUser.setStatus(1);
        loginUser.setIsSuperAdmin(true);
        loginUser.setIsTenantAdmin(true);
        loginUser.setDeptId(1L);
        loginUser.setPositionId(1L);
        
        // 设置权限
        Set<String> permissions = new HashSet<>();
        permissions.add("user:read");
        permissions.add("user:write");
        permissions.add("role:read");
        permissions.add("role:write");
        permissions.add("menu:read");
        permissions.add("menu:write");
        permissions.add("dept:read");
        permissions.add("dept:write");
        permissions.add("system:config");
        permissions.add("system:monitor");
        
        loginUser.setPermissions(permissions);
        
        // 设置角色
        Set<String> roles = new HashSet<>();
        roles.add("admin");
        roles.add("user");
        loginUser.setRoles(roles);
        
        // 设置登录信息
        loginUser.setLoginTime(System.currentTimeMillis());
        loginUser.setExpireTime(loginUser.getLoginTime() + 7200 * 1000); // 2小时
        
        return loginUser;
    }
    
    /**
     * 根据用户ID加载用户信息
     */
    public LoginUser loadUserById(Long userId) {
        // 这里应该从数据库或其他数据源中加载用户信息
        // 为了演示，这里创建一个模拟用户
        
        LoginUser loginUser = createMockUser("admin");
        loginUser.setUserId(userId);
        
        log.debug("根据用户ID加载用户信息: userId={}", userId);
        
        return loginUser;
    }
    
    /**
     * 验证用户密码
     */
    public boolean validatePassword(String rawPassword, String encodedPassword) {
        // 实际项目中应该使用PasswordEncoder进行验证
        // 这里简单返回true用于演示
        return true;
    }
    
    /**
     * 检查用户是否被锁定
     */
    public boolean isUserLocked(String username) {
        // 实际项目中应该检查用户锁定状态
        return false;
    }
    
    /**
     * 检查用户是否过期
     */
    public boolean isUserExpired(String username) {
        // 实际项目中应该检查用户过期状态
        return false;
    }
    
    /**
     * 检查凭证是否过期
     */
    public boolean isCredentialsExpired(String username) {
        // 实际项目中应该检查凭证过期状态
        return false;
    }
}